/**
 * 
 */
package org.swing.utility.jai.shape;

import java.awt.Color;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author lqnhu
 *
 */
public class ColorSchemaGenerator {

	public final static String SCHEMA_DEFAULT = "default";
	public final static String SCHEMA_PASTEL = "pastel";
	public final static String SCHEMA_SOFT = "soft";
	public final static String SCHEMA_HARD = "hard";
	public final static String SCHEMA_LIGHT = "light";
	public final static String SCHEMA_PALE = "pale";

	private static float[] schema_default = new float[] { -1f, -1f, 1f, -0.7f,
			0.25f, 1f, 0.5f, 1f };
	private static float[] schema_pastel = new float[] { 0.5f, -0.9f, 0.5f,
			0.5f, 0.1f, 0.9f, 0.75f, 0.75f };
	private static float[] schema_soft = new float[] { 0.3f, -0.8f, 0.3f, 0.5f,
			0.1f, 0.9f, 0.5f, 0.75f };
	private static float[] schema_hard = new float[] { 1f, -1f, 1f, -0.6f,
			0.1f, 1f, 0.6f, 1f };
	private static float[] schema_light = new float[] { 0.25f, 1f, 0.5f, 0.75f,
			0.1f, 1f, 0.5f, 1f };
	private static float[] schema_pale = new float[] { 0.1f, -0.85f, 0.1f,
			0.5f, 0.1f, 1f, 0.1f, 0.75f };

	private static java.util.Map<String, float[]> schemas = new HashMap<String, float[]>();

	static {

		schemas.put(SCHEMA_DEFAULT, schema_default);
		schemas.put(SCHEMA_PASTEL, schema_pastel);
		schemas.put(SCHEMA_SOFT, schema_soft);
		schemas.put(SCHEMA_HARD, schema_hard);
		schemas.put(SCHEMA_LIGHT, schema_light);
		schemas.put(SCHEMA_PALE, schema_pale);

	}

	/**
	 * Create the schema color.
	 * 
	 * @param base
	 * @param i
	 *            (a color between 0 and 3)
	 * @param schemaName
	 * @return
	 */
	public static Color createColor(Color base, int i, String schemaName) {

		i = Math.abs(i %= 3);
		if (schemaName == null)
			schemaName = SCHEMA_SOFT;
		float[] schema = schemas.get(schemaName);

		float[] components = Color.RGBtoHSB(base.getRed(), base.getGreen(),
				base.getBlue(), null);

		components[1] = (schema[i * 2] < 0) ? -schema[i * 2] * components[1]
				: schema[i * 2];
		if (components[1] > 1)
			components[1] = 1.0f;
		if (components[1] < 0)
			components[1] = 0;

		components[2] = (schema[i * 2 + 1] < 0) ? -schema[i * 2 + 1]
				* components[2] : schema[i * 2 + 1];
		if (components[2] > 1)
			components[2] = 1.0f;
		if (components[2] < 0)
			components[2] = 0;

		return new Color(Color.HSBtoRGB(components[0], components[1],
				components[2]));
	}

	public static List<String> getColors() {
		if (colorsList == null) {
			colorsList = new ArrayList<String>();
			colorsMap = new HashMap<String, String>();

			for (int i = 0; i < colors.length / 2; ++i) {
				colorsList.add(colors[i * 2]);
				colorsMap.put(colors[i * 2], colors[(i * 2) + 1]);
			}
		}

		return colorsList;
	}

	public static Color getColor(String name) {
		if (colorsMap == null) {
			getColors();
		}
		String rgb = colorsMap.get(name);
		return decodeColor("#" + rgb);
	}

	public static java.awt.Color decodeColor(String colorString) {
		java.awt.Color color = null;
		char firstChar = colorString.charAt(0);
		if (firstChar == '#') {
			color = new java.awt.Color(Integer.parseInt(
					colorString.substring(1), 16));
		} else if ('0' <= firstChar && firstChar <= '9') {
			color = new java.awt.Color(Integer.parseInt(colorString));
		} else {
			color = java.awt.Color.black;
		}
		return color;

	}

	static private List<String> colorsList = null;
	static private HashMap<String, String> colorsMap = null;

	static private String[] colors = new String[] { "Aliceblue", "F0F8FF",
			"Antiquewhite", "FAEBD7", "Aqua", "00FFFF", "Aquamarine", "7FFFD4",
			"Azure", "F0FFFF", "Beige", "F5F5DC", "Bisque", "FFE4C4", "Black",
			"000000", "Blanchedalmond", "FFEBCD", "Blue", "0000FF",
			"Blueviolet", "8A2BE2", "Brown", "A52A2A", "Burlywood", "DEB887",
			"Cadetblue", "5F9EA0", "Chartreuse", "7FFF00", "Chocolate",
			"D2691E", "Coral", "FF7F50", "Cornflowerblue", "6495ED",
			"Cornsilk", "FFF8DC", "Crimson", "DC143C", "Cyan", "00FFFF",
			"Darkblue", "00008B", "Darkcyan", "008B8B", "Darkgoldenrod",
			"B8860B", "Darkgray", "A9A9A9", "Darkgreen", "006400", "Darkkhaki",
			"BDB76B", "Darkmagenta", "8B008B", "Darkolivegreen", "556B2F",
			"Darkorange", "FF8C00", "Darkorchid", "9932CC", "Darkred",
			"8B0000", "Darksalmon", "E9967A", "Darkseagreen", "8FBC8F",
			"Darkslateblue", "483D8B", "Darkturqoise", "00CED1",
			"Darkslategray", "2F4F4F", "Darkviolet", "9400D3", "Deeppink",
			"FF1493", "Deepskyblue", "00BFFF", "Dimgray", "696969",
			"Dodgerblue", "1E90FF", "Firebrick", "B22222", "Floralwhite",
			"FFFAF0", "Forestgreen", "228B22", "Fuchsia", "FF00FF",
			"Gainsboro", "DCDCDC", "Ghostwhite", "F8F8FF", "Gold", "FFD700",
			"Goldenrod", "DAA520", "Gray", "808080", "Green", "008000",
			"Greenyellow", "ADFF2F", "Honeydew", "F0FFF0", "Hotpink", "FF69B4",
			"Indianred", "CD5C5C", "Indigo", "4B0082", "Ivory", "FFFFF0",
			"Khaki", "F0E68C", "Lavender", "E6E6FA", "Lavenderblush", "FFF0F5",
			"Lawngreen", "7CFC00", "Lemonchiffon", "FFFACD", "Lightblue",
			"ADD8E6", "Lightcoral", "F08080", "Lightcyan", "E0FFFF",
			"Lightgoldenrodyellow", "FAFAD2", "Lightgreen", "90EE90",
			"Lightgrey", "D3D3D3", "Lightpink", "FFB6C1", "Lightsalmon",
			"FFA07A", "Lightseagreen", "20B2AA", "Lightskyblue", "87CEFA",
			"Lightslategray", "778899", "Lisghtsteelblue", "B0C4DE",
			"Lightyellow", "FFFFE0", "Lime", "00FF00", "Limegreen", "32CD32",
			"Linen", "FAF0E6", "Magenta", "FF00FF", "Maroon", "800000",
			"Mediumaquamarine", "66CDAA", "Mediumblue", "0000CD",
			"Mediumorchid", "BA55D3", "Mediumpurple", "9370DB",
			"Mediumseagreen", "3CB371", "Mediumslateblue", "7B68EE",
			"Mediumspringgreen", "00FA9A", "Mediumturquoise", "48D1CC",
			"Mediumvioletred", "C71585", "Midnightblue", "191970", "Mintcream",
			"F5FFFA", "Mistyrose", "FFE4E1", "Moccasin", "FFE4B5",
			"Navajowhite", "FFDEAD", "Navy", "000080", "Navyblue", "9FAFDF",
			"Oldlace", "FDF5E6", "Olive", "808000", "Olivedrab", "6B8E23",
			"Orange", "FFA500", "Orangered", "FF4500", "Orchid", "DA70D6",
			"Palegoldenrod", "EEE8AA", "Palegreen", "98FB98", "Paleturquoise",
			"AFEEEE", "Palevioletred", "DB7093", "Papayawhip", "FFEFD5",
			"Peachpuff", "FFDAB9", "Peru", "CD853F", "Pink", "FFC0CB", "Plum",
			"DDA0DD", "Powderblue", "B0E0E6", "Purple", "800080", "Red",
			"FF0000", "Rosybrown", "BC8F8F", "Royalblue", "4169E1",
			"Saddlebrown", "8B4513", "Salmon", "FA8072", "Sandybrown",
			"F4A460", "Seagreen", "2E8B57", "Seashell", "FFF5EE", "Sienna",
			"A0522D", "Silver", "C0C0C0", "Skyblue", "87CEEB", "Slateblue",
			"6A5ACD", "Snow", "FFFAFA", "Springgreen", "00FF7F", "Steelblue",
			"4682B4", "Tan", "D2B48C", "Teal", "008080", "Thistle", "D8BFD8",
			"Tomato", "FF6347", "Turquoise", "40E0D0", "Violet", "EE82EE",
			"Wheat", "F5DEB3", "White", "FFFFFF", "Whitesmoke", "F5F5F5",
			"Yellow", "FFFF00", "Yellowgreen", "9ACD32" };

}